package db

import (
	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/plugin/dbresolver"
	"log"
	"os"
	"time"
)

var Dao *gorm.DB

// Init 初始化数据库
// sqlitePath 数据库路径
// 数据库文件不存在会自动创建
// 数据库文件路径为空时，默认使用 data/stock.db
func Init(sqlitePath string) {
	dbLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags),
		logger.Config{
			SlowThreshold:             time.Second * 3, //查询超 3 秒会被识别为慢查询并记录。
			Colorful:                  false,           //禁用彩色日志输出（适合日志文件或某些终端）。
			IgnoreRecordNotFoundError: true,            //忽略记录未找到错误（如查询无结果），不记录日志。
			ParameterizedQueries:      false,           //禁用参数化查询，可能会影响性能。
			LogLevel:                  logger.Error,    //日志级别，这里设置为 Info，记录所有 SQL 语句。
		},
	)
	var openDb *gorm.DB
	var err error
	// 数据库文件不存在会自动创建
	if sqlitePath == "" {
		sqlitePath = "data/stock.db?cache=shared&mode=rwc&_journal_mode=WAL"
	}
	openDb, err = gorm.Open(sqlite.Open(sqlitePath), &gorm.Config{
		Logger:                                   dbLogger, //使用自定义的日志记录器。
		DisableForeignKeyConstraintWhenMigrating: true,     //禁用外键约束，可能会影响数据完整性。
		SkipDefaultTransaction:                   true,     //跳过默认事务包装，提升性能（需要自己注意事务时机）。
		PrepareStmt:                              true,     //启用预编译语句缓存，提高重复 SQL 执行效率。
	})
	//读写分离提高sqlite效率，防止锁库
	openDb.Use(dbresolver.Register(
		dbresolver.Config{
			Replicas: []gorm.Dialector{sqlite.Open(sqlitePath)}},
	))

	if err != nil {
		log.Fatalf("db connection error is %s", err.Error())
	}

	dbCon, err := openDb.DB()
	if err != nil {
		log.Fatalf("openDb.DB error is  %s", err.Error())
	}
	dbCon.SetMaxIdleConns(10)           // 允许的最大空闲连接数
	dbCon.SetMaxOpenConns(100)          // 允许的最大打开连接数
	dbCon.SetConnMaxLifetime(time.Hour) // 连接的最大生命周期
	Dao = openDb
}
